////////////////////////////////////////////////////////////////////////////////

#ifndef _SERVERENGINE_H_
#define _SERVERENGINE_H_

////////////////////////////////////////////////////////////////////////////////

#ifndef _SERVERBATTLEFIELD_H_
#include "serverbattlefield.h"
#endif

#ifndef _SERVERSTATEPACKET_H_
#include "serverstatepacket.h"
#endif

////////////////////////////////////////////////////////////////////////////////

class Server;
class ClientInfoPacket;
class ClientInputPacket;

////////////////////////////////////////////////////////////////////////////////




/** Game server engine
*
*  @author   Roman Pasechnik
*  @since    Jun 04th, 2009
*  @updated  Nov 05st, 2009
*/
class ServerEngine
{
////////////////////////////////////////////////////////////////////////////////

public:

////////////////////////////////////////////////////////////////////////////////


    /** Constructor */
    ServerEngine();


    /** Destructor */
    virtual ~ServerEngine();


////////////////////////////////////////////////////////////////////////////////


    /* Start engine */
    void Start( Server* _server );


    /** Update engine state */
    void UpdateState();


    /** Update information about a client input */
    void UpdateClientInput( int _clientID, const ClientInputPacket& _clientInputPacket );


    /** Update information about a client info */
    void UpdateClientInfo( int _clientID, const ClientInfoPacket& _clientInfoPacket );


    /** Remove player from engine */
    void RemoveClient( int _clientID );


////////////////////////////////////////////////////////////////////////////////


    /** Get game state */
    ServerState GetState() const;


////////////////////////////////////////////////////////////////////////////////

private:

////////////////////////////////////////////////////////////////////////////////


    /** Get delta time from prev update */
    size_t GetTimeDiffFromPrevUpdate() const;


    /** Battle arena */
    ServerBattlefield m_Battlefield;


    /** Server interface */
    Server* m_Server;


////////////////////////////////////////////////////////////////////////////////
};


////////////////////////////////////////////////////////////////////////////////

#endif

////////////////////////////////////////////////////////////////////////////////

